home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / demo / mag / Infamia3.lha / infamia03 / mv_code / shade / ShadeBobs1.s next >
Text File  |  1996-07-24  |  10KB  |  301 lines

  1.         ************************************
  2.         *       /\/\                       *
  3.         *      /    \                      *
  4.         *     / /\/\ \ O R B_I D           *
  5.         *    / /    \ \   / /              *
  6.         *   / /    __\ \ / /               *
  7.         *   ¯¯     \ \¯¯/ / I S I O N S    *
  8.         *           \ \/ /                 *
  9.         *            \  /                  *
  10.         *             \/                   *
  11.         *     Feel the DEATH inside!       *
  12.         ************************************
  13.  
  14. ; Codice di autori sconosciuti adattato e migliorato da
  15. ; DeathBringer/Morbid Visions 
  16.  
  17. ***********************************************************
  18. * Shade Bobs
  19. *
  20. * La routine dello ShadeBob e' essenzialmente una implementazione della
  21. * capacita' del blitter di effettuare addizioni. Basta pensare ad ogni
  22. * pixel dello schermo sia un numero ad n cifre binarie
  23. * (dove n e' il numero dei bitplane), e quindi bisogna addizionare 1 a questo 
  24. * numero. Il nostro bob ad 1 bitplane, rappresenta la maschera che indica quali
  25. * pixel sono interessati all'addizione in un determinato quadro.
  26. * Per prima cosa si prendono il bob e l'area di schermo interessata e si
  27. * effettua un AND usando come destinazione un'area addizionale chiamata Carry.
  28. * Fatto questo si prende il bob e si effettua lo XOR con l'appropriato 
  29. * bitplane dello schermo. In seguito si continua usando l'area Carry come se
  30. * fosse il nostro bob per ogni bitplane. 
  31. * Chiaramente sono necessarie 2 aree Carry!!!
  32. ************************************************************
  33.  
  34.     section    ShadeBobs,code
  35.  
  36.         ;5432109876543210
  37. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  38.  
  39. WaitBlit:    macro
  40. .\@    btst.b    #6,dmaconr(a5)    ; niente test preliminare
  41.     bne.s    .\@        ; si tratta di un bug OCS
  42.     endm
  43.     
  44. WaitRast:    macro            ; Attendi una Linea di Raster
  45. .\@    move.l    vposr(a5),d0
  46.     lsr.l    #8,d0
  47.     and.w    #$1FF,d0
  48.     cmp.w    #\1,d0
  49.     bne.b    .\@
  50.     endm
  51.  
  52.     incdir    "Infamia:MV_code/"
  53.     include    MVstartup.s        ; Codice di startup: prende il
  54.                     ; controllo del sistema e chiama
  55.                     ; la routine START: ponendo
  56.                     ; A5=$DFF000
  57.  
  58. START:
  59.  
  60.     lea    BmapPtrs-2,a0        ; Inserisci ^Bitplanes
  61.                                         ; nella COPPERLIST
  62.         move.l  #Bmap,d0
  63.         moveq.l    #5-1,d1
  64. .loop    addq.l    #4,a0
  65.         swap d0
  66.         move.w  d0,(a0)
  67.         addq.l    #4,a0
  68.         swap    d0
  69.         move.w    d0,(a0)
  70.         add.l    #8000,d0
  71.         dbra    d1,.loop
  72.  
  73. ; A5 e` inizializzato al valore $DFF000 (base registri hardware) nella
  74. ; routine di startup
  75.     move.l    #Copper,cop1lc(A5)    ; copperlist
  76.     move.w    #DMASET,dmacon(A5)    ; Copper+Blitter+Bplanes
  77.  
  78. MAIN:    
  79.     WaitRast    $0f4        ;aspetta la linea di raster 244
  80.  
  81.     move.l    x_ptr(pc),a3        ;Copia puntatori alle tabelle x e y
  82.     move.l    y_ptr(pc),a4        ;in a3 e in a4 rispettivamente
  83.  
  84.     cmp.l    xl_ptr(pc),a3        ;Fine tabella delle x?
  85.     bne.b    .xok            ;no
  86.     move.l    xr_ptr(pc),a3        ;si, resetta il puntatore
  87. .xok:
  88.     cmp.l    yl_ptr(pc),a4    ;Fine della tabella delle y?
  89.     bne.b    .yok        ;no
  90.     move.l    yr_ptr(pc),a4    ;si, resetta puntatore
  91. .yok:
  92.     moveq    #0,d0        ;Cancella
  93.     moveq    #0,d1        ;d1 e d0
  94.  
  95.     move.b    (a3)+,d0    ;d0=x/2    (Vedi nota)
  96.     move.b    (a4)+,d1    ;d1=y
  97.     add.w    d0,d0        ;d0=x
  98.     move.l    a3,x_ptr    ;aggiorna puntatori
  99.     move.l    a4,y_ptr    ;delle tabelle x e y
  100.     bsr    ShadeBob    salta alla routine di Shade
  101.  
  102.     moveq    #0,d0
  103.     moveq    #0,d1
  104.     move.b    10(a3),d0    ;nuova coordinata x
  105.     move.b    (a4),d1        ;stessa coordinata y
  106.     add.w    d0,d0
  107.     bsr    ShadeBob
  108.  
  109.     moveq    #0,d0
  110.     moveq    #0,d1
  111.     move.b    (a3),d0        ;stessa coordinata x
  112.     move.b    10(a4),d1    ;nuova coordinata y
  113.     add.w    d0,d0
  114.     bsr    ShadeBob
  115.  
  116.     btst    #6,$BFE001    ; bottone sinistro del mouse premuto?
  117.     bne.w    MAIN        ;no, continua
  118.     rts            ;si, esci
  119.  
  120. ***********************************************************
  121. * Shade Bob
  122. * d0 : x
  123. * d1 : y
  124.  
  125. ShadeBob:
  126.  
  127.     movem.l    d0-d5/a0-a3,-(a7)
  128.     move.l    d0,d2    ; copia d0 in d2
  129.     lsr.w    #4,d2    ; d2=word offset
  130.     add.w    d2,d2    ; che contiene il pixel nella posizione 'x'
  131.  
  132.     andi.l    #$f,d0    ; i quattro bit alti di d0 
  133.     ror.l    #4,d0    ; contengono lo shift per il blitter 
  134.  
  135.     mulu    #40,d1    ; d1=offset nella bitmap
  136.             ; che e' la linea 'y' (ogni linea 40 bytes)
  137.     add.w    d1,d2    ; offset totale
  138.  
  139.     lea    Bob,a0
  140.     lea    Bmap,a1
  141.     lea    Carry1,a2
  142.     lea    Carry2,a3
  143.  
  144.     adda.l    d2,a1    ; posizione del bob nella bitmap
  145.  
  146.     moveq    #0,d2    ; modulo
  147.     moveq    #$22,d3    ; modulo  (40-6)
  148.     move.w    #(31<<6)+3,d5    ; bltsize, Bob=31*(32+16) pixels
  149.  
  150.     move.l    #$0ba00000,d4    ;abilita il dma dei canali ACD, setta lo shift
  151.     or.l    d0,d4        ;x il canale A e calcola la funzione d=a AND c
  152.     
  153.     move.w    #$8400,dmacon(a5)    ;Blitternasty ON
  154.         
  155.     WaitBlit
  156.     move.l    a0,bltapt(A5)    ; canale A=bob
  157.     move.l    a1,bltcpt(A5)    ; canale C=Bitmap
  158.     move.l    a2,bltdpt(A5)    ; canale D=Carry1
  159.     move.w    d3,bltcmod(A5)    ; bltcmod=$22
  160.     move.l    d2,bltamod(A5)    ; bltamod e bltdmod=0
  161.     move.l    d4,bltcon0(A5)    ; bltcon0&bltcon1
  162.      move.w    d5,bltsize(A5)    ; bltsize
  163.  
  164.     move.l    #$0b5a0000,d4    ; d = a EOR c
  165.     or.l    d0,d4
  166.     
  167.     WaitBlit
  168.     move.l    a0,bltapt(A5)    ; canale A=bob
  169.     move.l    a1,bltcpt(A5)    ; canale C=Bitmap
  170.     move.l    a1,bltdpt(A5)    ; canale D=bitmap
  171.     move.w    d3,bltdmod(A5)    ; bltdmod=$22 - gli altri moduli sono costanti
  172.     move.l    d4,bltcon0(A5)    ; nuova funzione minterms
  173.      move.w    d5,bltsize(A5)
  174.  
  175.     moveq    #4-1,d7        ;Bitplane rimanenti
  176. ; Adesso l'area Carry indirizzata da a2 diventa il nostro Bob, e l'area    
  177. ; carry indirizzata da a3 diventa la nostra area Carry vera e propria
  178.  
  179. .1
  180.     adda.l    #8000,a1    ;prossimo bitplane
  181.     move.w    #$0ba0,d4    ; d = a AND c
  182.  
  183.     WaitBlit
  184.     move.l    a2,bltapt(A5)    ; canale A=Carry1
  185.     move.l    a1,bltcpt(A5)    ; canale C=Bitmap
  186.     move.l    a3,bltdpt(A5)    ; canale D=Carry2
  187.     move.w    d3,bltcmod(A5)    ; bltcmod=$22
  188.     move.w    d2,bltdmod(A5)    ; bltdmod=0
  189.     move.w    d4,bltcon0(A5)
  190.      move.w    d5,bltsize(A5)
  191.  
  192.     move.w    #$0b5a,d4    ; d = a EOR c
  193.     
  194.     WaitBlit
  195.     move.l    a2,bltapt(A5)    ; canale A=Carry1
  196.     move.l    a1,bltcpt(A5)    ; canale C=Bitmap
  197.     move.l    a1,bltdpt(A5)    ; canale D=Bitmap
  198.     move.w    d3,bltdmod(A5)    ; bltdmod=$22
  199.     move.w    d4,bltcon0(A5)
  200.      move.w    d5,bltsize(A5)
  201.  
  202.     exg    a2,a3        ;Scambia le due aree Carry
  203.     dbf    d7,.1
  204.  
  205.     move.w    #$0400,dmacon(a5)    ;Disabilita Blitternasty
  206.     movem.l    (a7)+,d0-d5/a0-a3
  207.     rts
  208.  
  209.  
  210. ***********************************************************************
  211. ;    DATI CHE NON VANNO IN CHIPRAM
  212.  
  213. x_ptr:    dc.l    Sine1    ;Puntatore tabella delle x
  214. y_ptr:    dc.l    Sine2    ;Puntatore tabella delle y
  215. xr_ptr:    dc.l    Sine1    ;Indirizzo di START tabella delle x
  216. yr_ptr:    dc.l    Sine2    ;Indirizzo di START tabella delle y
  217. xl_ptr:    dc.l    Sine1e    ;Indirizzo di END tabella delle x
  218. yl_ptr:    dc.l    Sine2e    ;Indirizzo di END tabella delle y
  219.  
  220. ;NOTA:    le coordinate delle x sono memorizzate divise per 2 in modo che 
  221. ;    abbiano dimensione 1 byte. 
  222.  
  223. Sine1:
  224.     dc.b    $46,$43,$41,$3E,$3C,$39,$37,$35,$32,$30,$2D,$2B
  225.     dc.b    $29,$27,$25,$22,$20,$1E,$1C,$1A,$18,$17,$15,$13
  226.     dc.b    $11,$10,14,13,11,10,9,8,6,5,5,4,3,2,2,1,1,0,0,0,0
  227.     dc.b    0,0,0,0,0,1,1,2,2,3,4,5,6,7,8,9,10,12,13,15,$10
  228.     dc.b    $12,$13,$15,$17,$19,$1B,$1D,$1F,$21,$23,$25,$27
  229.     dc.b    $29,$2C,$2E,$30,$33,$35,$37,$3A,$3C,$3F,$41,$44
  230.     dc.b    $46,$49,$4B,$4D,$50,$52,$55,$57,$59,$5C,$5E,$60
  231.     dc.b    $63,$65,$67,$69,$6B,$6D,$6F,$71,$73,$75,$77,$78
  232.     dc.b    $7A,$7C,$7D,$7F,$80,$81,$83,$84,$85,$86,$87,$88
  233.     dc.b    $88,$89,$8A,$8A,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B
  234.     dc.b    $8B,$8B,$8A,$8A,$89,$89,$88,$87,$86,$85,$84,$83
  235.     dc.b    $82,$80,$7F,$7E,$7C,$7A,$79,$77,$75,$74,$72,$70
  236.     dc.b    $6E,$6C,$6A,$68,$65,$63,$61,$5F,$5C,$5A,$58,$55
  237.     dc.b    $53,$51,$4E,$4C,$49,$47
  238. Sine1e:
  239.     dc.b    $46,$43,$41,$3E,$3C,$39,$37,$35,$32,$30,$2D,$2B
  240.  
  241. Sine2:
  242.     dc.b    $46,$43,$41,$3F,$3D,$3A,$38,$36,$34,$32,$2F,$2D
  243.     dc.b    $2B,$29,$27,$25,$23,$21,$1F,$1E,$1C,$1A,$18,$17
  244.     dc.b    $15,$13,$12,$10,15,13,12,11,10,9,8,6,6,5,4,3,2,2
  245.     dc.b    1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,5,5,6,7,8
  246.     dc.b    10,11,12,13,15,$10,$11,$13,$15,$16,$18,$1A,$1B
  247.     dc.b    $1D,$1F,$21,$23,$25,$27,$29,$2B,$2D,$2F,$31,$33
  248.     dc.b    $36,$38,$3A,$3C,$3E,$41,$43,$45,$47,$4A,$4C,$4E
  249.     dc.b    $50,$52,$55,$57,$59,$5B,$5D,$5F,$61,$63,$65,$67
  250.     dc.b    $69,$6B,$6D,$6F,$71,$73,$74,$76,$77,$79,$7A,$7C
  251.     dc.b    $7D,$7F,$80,$81,$82,$83,$84,$85,$86,$87,$88,$88
  252.     dc.b    $89,$8A,$8A,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B
  253.     dc.b    $8B,$8B,$8A,$8A,$89,$89,$88,$87,$87,$86,$85,$84
  254.     dc.b    $83,$82,$81,$7F,$7E,$7D,$7B,$7A,$78,$77,$75,$73
  255.     dc.b    $72,$70,$6E,$6C,$6A,$68,$67,$65,$63,$60,$5E,$5C
  256.     dc.b    $5A,$58,$56,$54,$51,$4F,$4D,$4B,$49,$46
  257. Sine2e:
  258.     dc.b    $46,$43,$41,$3F,$3D,$3A,$38,$36,$34,$32,$2F,$2D
  259.  
  260. ***********************************************************
  261.  
  262.     section    THEDATA,data_c    
  263.  
  264. Copper:    
  265.     dc.l    $1f